tags: 學習筆記
CI/CD
大多數企業採用敏捷開發,而在程式上傳到伺服器的過程中需要經過許多步驟,因此我們可以透過自動化來減少在一連串步驟中>的人為疏失,並加速整體開發流程。解決人類懶惰的天性
何謂CI/CD
CI(Continuous integration)持續整合or自動化整合
將開發至一個階段性的程式碼(通常是版本控制的一個commit)經由自動化工具測試(unit test),協助檢查程式碼問題並建置出部屬的版本。CD (Continuous Deployment)持續部署or自動化佈署
CI完成後自動將程式更新到伺服器上運作,減少人工佈署的時間。
好的CD包含監控系統進行服務存活檢查,並在發生異常時主動通知開發人員。
常見CI/CD工具
架設在本地端
- Jenkins: 最古老的工具
- 優點: 能夠自行編寫插件達成各式各樣功能
- 缺點: 學習成本高、維護不易、設定檔難撰寫
- Drone: 近年新出的工具,用Golang開發,會自動建立Docker執行流程並在完成後刪除
- 優點: 較易學習、建置速度快、容量小、所有流程都在Docker內完成
- 缺點: 套件不多
### 雲端
- GitLab CI: 只能使用在GitLab
- GitHub Action: 相對年輕的工具,只能用在Github
GitHub Action
文件
由repository內的yaml檔定義,在事件觸發時運行(可手動或排程)。
在.github/workflows
資料夾內建立*.yml
即完成,會把結果用email寄信通知開發人員(目前已知觸發push時會傳送給push人員,其他條件寄信給誰尚不清楚,似乎是看用哪個帳號執行)
核心概念
Actions/commands
GitHub Actions的最小單位
# Actions
- name: Set up Go
uses: actions/setup-go@v3
with:
go-version: 1.19
step
由Actions/commands組成,每個step代表自動化的一個步驟,
# steps
steps:
- uses: actions/checkout@v3
- name: Set up Go
uses: actions/setup-go@v3
with:
go-version: 1.19
- name: Build
run: go build -v ./...
- name: Test
run: go test -v ./...
Job
由多個step組成,用來定義不同的任務,例如測試的job及deploy的job,所有job會同時執行,除非寫上條仵needs
或if
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Go
uses: actions/setup-go@v3
with:
go-version: 1.19
- name: Build
run: go build -v ./...
- name: Test
run: go test -v ./...
deploy:
name: Deploy
runs-on: ubuntu-latest
environment: production
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_REGION }}
...
帳號密碼請勿寫在.yml檔內,所有能看到repository的人都能看到。
- 一般變數可設定在Enviroment Variables
- 敏感資訊可設定在Secrets
上面兩項只有repository owner能設定。
Workflow
整個自動化流程,當中可能包含多個job。
在文仵開頭須定義workflow名稱(name)及觸發條仵(on)
name: Go-test # 可自行定義,主要目的是要能看出哪個workflow在執行
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]